package com.mjf.tankgame.v5;

import java.util.Vector;

/**
 * 坦克父类
 */
public class Tank {
    private int x;  // 坦克的横坐标
    private int y;  // 坦克的纵坐标
    private int direct = 0; // 坦克方向 0 上1 右 2下 3左
    private int speed = 3;
    boolean isLive = true;

    // 使用 Vector 保存多个Shot
    Vector<Shot> shots = new Vector<>();

    // 使用 Vector 保存所有坦克,判断坦克之间是否重叠
    Vector<Tank> allTank = new Vector<>();

    // 定义一个Shot对象, 表示一个射击(线程)
    Shot shot = null;

    public void setAllTank(Vector<Tank> allTank) {
        this.allTank = allTank;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    /**
     * 判断当前坦克是否碰撞到其他坦克
     * @return true:表示碰到其他坦克
     */
    public boolean isTouchOtherTank() {
        // 根据当前坦克方向分类讨论
        switch (this.getDirect()) {
            case 0: // 向上
                // 当前坦克 左上角的坐标 [this.getX(), this.getY()]
                // 当前坦克 右上角的坐标 [this.getX() + 40, this.getY()]
                for (int i=0;i < allTank.size();i++) {
                    if (allTank.get(i) != this) {    // 不与自己比较
                        if(isTouch(this.getX(), this.getX() + 40, this.getY(), this.getY(), allTank.get(i))) {
                            return true;
                        }
                    }
                }
                break;
            case 1: // 向右
                // 当前坦克 右上角的坐标 [this.getX() + 60, this.getY()]
                // 当前坦克 右下角的坐标 [this.getX() + 60, this.getY() + 40]
                for (int i=0;i < allTank.size();i++) {
                    if (allTank.get(i) != this) {    // 不与自己比较
                        if(isTouch(this.getX() + 60, this.getX() + 60, this.getY(), this.getY() + 40, allTank.get(i))) {
                            return true;
                        }
                    }
                }
                break;
            case 2: // 向下
                // 当前坦克 左下角的坐标 [this.getX(), this.getY() + 60]
                // 当前坦克 右下角的坐标 [this.getX() + 40, this.getY() + 60]
                for (int i=0;i < allTank.size();i++) {
                    if (allTank.get(i) != this) {    // 不与自己比较
                        if(isTouch(this.getX(), this.getX() + 40, this.getY() + 60, this.getY() + 60, allTank.get(i))) {
                            return true;
                        }
                    }
                }
                break;
            case 3: // 向左
                // 当前坦克 左上角的坐标 [this.getX(), this.getY()]
                // 当前坦克 左下角的坐标 [this.getX(), this.getY() + 40]
                for (int i=0;i < allTank.size();i++) {
                    if (allTank.get(i) != this) {    // 不与自己比较
                        if(isTouch(this.getX(), this.getX(), this.getY(), this.getY() + 40, allTank.get(i))) {
                            return true;
                        }
                    }
                }
                break;
        }

        return false;
    }

    /**
     * 判断当前坦克是否碰撞到指定坦克
     * @param minX 当前坦克最小的X坐标
     * @param maxX 当前坦克最大的X坐标
     * @param minY 当前坦克最小的Y坐标
     * @param maxY 当前坦克最大的Y坐标
     * @param tank 指定坦克
     * @return true:表示碰到指定坦克
     */
    public boolean isTouch(int minX, int maxX, int minY, int maxY, Tank tank) {
        boolean flag = false;
        // 根据指定坦克方向分类讨论
        if(tank.getDirect() == 0 || tank.getDirect() == 2) {    // 坦克在上下移动
            // x的范围 [tank.getX(), tank.getX() + 40]
            // y的范围 [tank.getY(), tank.getY() + 60]
            if(minX >= tank.getX() && minX <= tank.getX() + 40 && minY >= tank.getY() && minY <= tank.getY() + 60) {
                flag = true;
            } else if(maxX >= tank.getX() && maxX <= tank.getX() + 40 && maxY >= tank.getY() && maxY <= tank.getY() + 60) {
                flag = true;
            }
        } else {    // 坦克在左右移动
            // x的范围 [tank.getX(), tank.getX() + 60]
            // y的范围 [tank.getY(), tank.getY() + 40]
            if(minX >= tank.getX() && minX <= tank.getX() + 60 && minY >= tank.getY() && minY <= tank.getY() + 40) {
                flag = true;
            } else if(maxX >= tank.getX() && maxX <= tank.getX() + 60 && maxY >= tank.getY() && maxY <= tank.getY() + 40) {
                flag = true;
            }
        }
        return flag;
    }

    // 坦克射击
    public Shot shot() {
        // 创建 Shot 对象, 根据当前对象的位置和方向来创建Shot
        switch (getDirect()) { // 得到方向
            case 0: // 向上
                shot = new Shot(getX() + 20, getY(), 0);
                break;
            case 1: // 向右
                shot = new Shot(getX() + 60, getY() + 20, 1);
                break;
            case 2: // 向下
                shot = new Shot(getX() + 20, getY() + 60, 2);
                break;
            case 3: // 向左
                shot = new Shot(getX(), getY() + 20, 3);
                break;
        }

        return shot;

    }

    // 上 右 下 左 移动方法
    public void moveUp() {
        if (y - speed >= 0 && !isTouchOtherTank()) {
            y -= speed;
        }
    }

    public void moveRight(int panelWidth) {
        if (x + 60 + speed <= panelWidth && !isTouchOtherTank()) {
            x += speed;
        }
    }

    public void moveDown(int panelHeight) {
        if (y + 60 + speed <= panelHeight && !isTouchOtherTank()) {
            y += speed;
        }
    }

    public void moveLeft() {
        if (x - speed >= 0 && !isTouchOtherTank()) {
            x -= speed;
        }
    }

    public int getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }

    public Tank(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}
